package com.threeti.mecool.core.application.project;

import com.threeti.mecool.core.domain.model.acl.OrgnizationEmployee;
import com.threeti.mecool.core.domain.model.acl.User;
import com.threeti.mecool.core.domain.model.dto.AssignableProjectStoreDto;
import com.threeti.mecool.core.domain.model.project.*;
import com.threeti.mecool.legacy.domain.model.basicdata.biz.SalesLegacy;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import java.util.List;
import java.util.Map;

/**
 * @author Jay Meng
 */
public interface ProjectService {
    /**
     * 取得特定用户自己参与的所有项目，不包括下属用户的项目<p>
     * <p/>
     * 1.特定系统用户对应企业组织机构的特定员工<br/>
     * 2.只有当系统用户和该特定员工进行了绑定，并且该员工参与到某个项目中，那么该项目才会出现在本次查询的结果集中
     */
    @Deprecated
    List<Project> findByUserOwn(User user);

    /**
     * 取得特定雇员参与的所有项目，不包括下属雇员的项目<p>
     * <p/>
     * 1.特定雇员对应企业组织机构的特定员工<br/>
     */
    List<Project> findByEmployeeOwn(OrgnizationEmployee orgEmp);

    /**
     * 取得在项目中<b>预分配</b>给用户的门店(终端)列表<p>
     * <p/>
     * 1.此场景中，被预分配到门店的用户角色通常即指<b>督导</b>
     */
    List<ProjectStore> findStoresPreAssignedToUserWithinTheProject(User user, Long projectId);

    /**
     * 取得在项目中<b>预分配</b>给促销员的门店(终端)列表<p>
     */
    List<ProjectStore> findStoresPreAssignedToSalesWithinTheProject(String salesCode, Long projectId);

    /**
     * 持久化项目员工组织架构(树)<p>
     * <p/>
     * 1.但凡在项目的组织架构中对员工树做过修改，那么该员工关联的相关绑定关系将被强制解除，如员工(督导)关联的门店<br/>
     * <b>注意，解除的是绑定关系，而不是指关联实体的删除，本方法不应该引起员工相关实体(如门店)的删除</b>
     */
    Project storeProjectEmloyeesHierarchy(Long projectId, List<ProjectEmployeeRawTreeNode> projectEmployeesHierarchy);

    /**
     * 取得项目负责人<p>
     * <p/>
     * 1.项目负责人，一般即指项目经理，是树的顶点
     * 2.本方法一般用于从项目负责人开始进行整树抓取，向下遍历，每个节点均有parent和childs
     */
    ProjectEmployee findProjectManager(Long projectId);

    /**
     * 取得在项目中可供督导选择的门店集合 <p>
     * <p/>
     * 1.指在特定项目中还未分配给任何督导的门店集合 <br/>
     * 2.已向督导进行过分配的门店不会出现在该集合中
     */
    Page<ProjectStore> findCandidateProjectStoresWhichCanBeAssigned(Long projectId, Pageable pageable);

    /**
     * 取得在项目中可供促销员选择的门店集合 <p>
     * <p/>
     * 1.指在特定项目中还未分配给任何促销员的门店集合 <br/>
     * 2.已向促销员进行过分配的门店不会出现在该集合中
     */
    Page<ProjectStore> findCandidateProjectStoresWhichCanBeAssignedToSalesPromoter(Long projectId, Pageable pageable);

    /**
     * 删除项目(TODO jay:考虑逻辑删除 慎用物理删除，可能会导致因找不到项目数据而产生异常，如工作流任务等)
     */
    @Deprecated
    void removeProject(Long projectId);

    /**
     * 为特定项目员工(通常就是督导)批量分配门店 <p>
     * <p/>
     * 1.本方法在首次分配时可以使用 <br/>
     * 2.本方法为强制刷新方法，当需要重新分配门店时也可以使用，即如果需要批量解除门店分配的同时再次绑定新的门店{@link #unbindWithSpecifiedAssignedStore}时，建议使用本方法
     */
    ProjectEmployee assignStoresToProjectEmployee(Long projEmpId, List<Long> targetStoreIds);

    /**
     * 为特定促销员批量分配门店 <p>
     * <p/>
     * 1.本方法在首次分配时可以使用 <br/>
     * 2.本方法为强制刷新方法，当需要重新分配门店时也可以使用，即如果需要批量解除门店分配的同时再次绑定新的门店{@link #unbindWithSpecifiedAssignedStore}时，建议使用本方法
     */
    ProjectSalesPromoter assignStoresToProjectSalesPromoter(Long projSalesId, List<Long> targetStoreIds);

    /**
     * 为特定项目员工(通常就是督导)批量解除门店的分配(绑定)
     */
    ProjectEmployee unbindWithSpecifiedAssignedStore(Long projEmpId, List<Long> projectStoreIdsNeedToBeUnbinded);

    /**
     * 为特定促销员批量解除门店的分配(绑定)
     */
    ProjectSalesPromoter unbindProjectSalesWithSpecifiedAssignedStore(Long projSalesId, List<Long> projectStoreIdsNeedToBeUnbinded);

    /**
     * 持久化项目采集项
     */
    Project storeProjectProducts(Long projectId, ProjectProductCollectionType collectionType, List<String> productsSkuCodes);

    /**
     * 保存项目门店
     *
     * @param entities
     * @return
     * @author Yuqi Chou
     * @version Aug 15, 2012  2:48:14 PM
     */
    int saveProjectStore(List<ProjectStore> entities);

    List<Long> findProjectIdListByOrganizationCodeList(List<String> organizationCodeList);


    Page<ProjectStore> findCandidateProjectStoresWhichCanBeAssignedToSalesPromoter(Long projId, String saleCode, Pageable pageable);


    Page<SalesLegacy> findSalesPromoter(Map<String, String> parameterMap,Pageable pageable);

    /**
     * 筛选给定门店id已分配过的门店id
     * @author Yuqi Chou
     * @param storeCodes
     * @return
     * @version Aug 30, 2012  3:01:15 PM
     */
	List<String> filterStoreIdsBySaleAssigned(List<String> storeCodes,String saleId,long projectId);

    Page<AssignableProjectStoreDto> listAssignableProjectStores(String userLoginName, String projectCode, String storeName, Pageable pageable);

    String getUserInvolvedProjectCodeString(String empId);

    String getUserInvolvedProjectIdString(String empId);


    List<Map<String, Object>> findProjectBasicInfoByUserPermission(User user);
}
